home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ARASAN_S.ZIP / SLIST.H < prev    next >
C/C++ Source or Header  |  1994-07-15  |  2KB  |  124 lines

  1. // Copyright 1992 by Jon Dart. All Rights Reserved
  2.  
  3. #ifndef S_LIST_H
  4. #define S_LIST_H
  5. #include "snode.h"
  6.  
  7. template <class T>
  8. class S_List { 
  9.    // singly-linked unordered list class    
  10.  
  11. public:
  12.        
  13.      S_List();
  14.      virtual ~S_List();
  15.      unsigned Length() {
  16.     return len;
  17.      }
  18.      int Empty() {
  19.     return len == 0;
  20.      }
  21.      void Rewind() {
  22.     current = first;     
  23.      }
  24.      T *First() {
  25.     return first->Contents();
  26.      }
  27.      T *Last() {
  28.     return last->Contents();
  29.      }
  30.      T *Current() {
  31.     return current->Contents();
  32.      }
  33.      virtual T *Next();
  34.      void Insert( const T &item );
  35.      void Traverse( void (*func)(T *) );
  36.  
  37.      void *operator new(size_t size)
  38.      {
  39.     return allocator.allocate(size);
  40.      }
  41.  
  42.      void operator delete( void *p )
  43.      {
  44.     allocator.free(p);
  45.      }
  46.  
  47.      static void freeAll(Boolean final = False)
  48.      {
  49.     allocator.freeAll(final);
  50.      }
  51.  
  52. private:
  53.      S_Node<T> *first;
  54.      S_Node<T> *current;
  55.      S_Node<T> *last;
  56.      unsigned len;
  57.      static Pool allocator;
  58.  
  59. };
  60.  
  61. template <class T>
  62. S_List<T>::S_List() {
  63.    first = current = last = NULL;
  64.    len = 0;
  65. }
  66.  
  67. template <class T>
  68. S_List<T>::~S_List()
  69. {
  70. //    don't delete the contents
  71. //    Rewind();
  72. //    S_Node<T> *tmp;
  73.  
  74. //    while (current)
  75. //    {
  76. //       tmp = current->Link();
  77. //       delete current;
  78. //       current = tmp;
  79. //    }    
  80.     first = current = last = NULL;
  81.     len = 0;
  82. }
  83.  
  84. template <class T>
  85. T * S_List<T>::Next() 
  86. {
  87.   if (current == NULL) 
  88.      return NULL;
  89.   current = current->Link();
  90.   if (current == NULL) 
  91.      return NULL;
  92.   return current->Contents();
  93. }
  94.  
  95. template <class T>
  96. void S_List<T>::Insert( const T &item )
  97. {
  98.    S_Node<T> *new_node = new S_Node<T>(item);
  99.  
  100.    new_node->MakeLink( NULL );
  101.    if (last == NULL) // list is empty
  102.       first = new_node;
  103.    else
  104.       last->MakeLink(new_node);
  105.    current = last = new_node;
  106.    len++;
  107. }
  108.  
  109. template <class T>
  110. void S_List<T>::Traverse( void (*func)(T *) )
  111. {
  112.    unsigned i;
  113.  
  114.    Rewind();
  115.    for( i = 0; i < Length(); i++ )
  116.    {
  117.       (*func)( Current() );
  118.       Next();
  119.    }
  120. }
  121.  
  122. #endif
  123.  
  124.